﻿using System;
using System.Collections.Generic;
using System.IO;
using csvm.contracts.components.CSV;
using csvm.contracts.datamodel;

namespace csvm.csvrepo
{
    public sealed class DatensätzeLesen : IDatensätzeLesen
    {
        private bool m_MetadatenkopfGeschrieben;
        private string m_CsvDateiname;

        public void In_MetadatenkopfGeschrieben()
        {
            m_MetadatenkopfGeschrieben = true;
            LeseDatensätze();
        }

        public void In_DatensätzeLesen( string csvDateiname )
        {
            m_CsvDateiname = csvDateiname;
            LeseDatensätze();
        }

        public event Action<IEnumerable<Datensatz>> Out_DatensätzeGelesen;

        public event Action<Prozent> Out_Lesefortschritt;

        private void LeseDatensätze()
        {
            if( InPinsNichtGesetzt() )
            {
                return;
            }
            Out_DatensätzeGelesen( StarteLesen() );
        }

        private bool InPinsNichtGesetzt()
        {
            return !m_MetadatenkopfGeschrieben || m_CsvDateiname == null;
        }

        private IEnumerable<Datensatz> StarteLesen()
        {
            using( var streamReader = File.OpenText( m_CsvDateiname ) )
            {
                string line;

                // Kopfzeile sowie alle weiteren Datensätze einzeln zurückgeben
                while( ( line = streamReader.ReadLine() ) != null )
                {
                    var prozent = (int)( 100 * streamReader.BaseStream.Position / streamReader.BaseStream.Length );
                    Out_Lesefortschritt( new Prozent( prozent ) );

                    yield return new Datensatz( line );
                }
            }
        }
    }
}